/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * MovimentoInternalFrame.java
 *
 * Created on 31/07/2009, 12:10:55
 */
package br.di0.nyx;

import br.di0.nyx.cadastro.CadastroFrame;
import br.di0.nyx.cadastro.CadastroInternalFrame;
import br.di0.sql.consulta.ConsultaPersonDialog;
import br.di0.sql.consulta.ConsultaProdutoDialog;
import br.di0.sql.insert.InsertEstoque;
import br.di0.sql.insert.InsertMovimento;
import br.di0.sql.insert.InsertPerson;
import br.di0.sql.insert.InsertProdutos;
import br.di0.uteis.MetodosUteis;
import br.di0.uteis.MyOwnFocusTraversalPolicy;
import java.awt.Component;
import java.awt.event.KeyEvent;
import java.util.Locale;
import java.util.Vector;
import javax.swing.JComponent;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableModel;
import strategy.IDocument;
import strategy.concretas.DocNovo;
import strategy.concretas.DocNumeros;

/**
 *
 * @since 2009.08.17
 * @author di0
 */
public class MovimentoInternalFrame extends javax.swing.JInternalFrame
        implements CadastroFrame {

    /**
     * Cria um novo Form de Movimento
     * @param titulo o titulo da janela
     * @param tipo MovimentoInternalFrame.CLIENTE para definir como uma janela de vendas
     * MovimentoInternalFrame.FORNECEDOR para definir como uma janela de compras.
     */
    public MovimentoInternalFrame(String titulo, int tipoPerson) {
        Locale.setDefault(new Locale("pt", "BR"));
        initComponents();
        this.setTitle(titulo);
        this.tipoPerson = tipoPerson;
        if (tipoPerson == MovimentoInternalFrame.CLIENTE) {
            stringPerson = "Vendas";
        } else {
            stringPerson = "Compras";
        }
        focusCicle();
        utils.setEnterHowNextTraversalKey(contentsPanel);
        utils.removeEnterHowNextTraversalKey(controlProdutoPanel);
        utils.removeEnterHowNextTraversalKey(controlPedidoPanel);
        utils.removeEnterHowNextTraversalKey(controlPersonPanel);
        limitarCampos();

        if (tipoPerson == CLIENTE) {
            personPanel.setBorder(javax.swing.BorderFactory.createTitledBorder("Cliente"));
        }
        if (tipoPerson == FORNECEDOR) {
            personPanel.setBorder(javax.swing.BorderFactory.createTitledBorder("Fornecedor"));
        }

        listSelectionModel = produtosTable.getSelectionModel();
        listSelectionModel.addListSelectionListener(
                new SharedListSelectionHandler());
        dataPedidoTextField.requestFocusInWindow();
        dataPedidoTextField.requestFocus();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        comandosPanel = new javax.swing.JPanel();
        salvarButton = new javax.swing.JButton();
        cancelarButton = new javax.swing.JButton();
        contentsPanel = new javax.swing.JPanel();
        pedidoPanel = new javax.swing.JPanel();
        codPedidoLabel = new javax.swing.JLabel();
        codPedidoTextField = new javax.swing.JTextField();
        novoCheckBox = new javax.swing.JCheckBox();
        dataPedidoLabel = new javax.swing.JLabel();
        dataPedidoTextField = new javax.swing.JTextField();
        controlPedidoPanel = new javax.swing.JPanel();
        buscaPedidoButton = new javax.swing.JButton();
        carregarPedidoButton = new javax.swing.JButton();
        personPanel = new javax.swing.JPanel();
        codPersonLabel = new javax.swing.JLabel();
        codPersonTextField = new javax.swing.JTextField();
        buscaPersonButton = new javax.swing.JButton();
        nomePersonLabel = new javax.swing.JLabel();
        nomePersonTextField = new javax.swing.JTextField();
        controlPersonPanel = new javax.swing.JPanel();
        carregarPersonButton = new javax.swing.JButton();
        produtosPanel = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        codProdutoTextField = new javax.swing.JTextField();
        buscaProdutoButton = new javax.swing.JButton();
        descricaoTextField = new javax.swing.JTextField();
        qtdProdutoLabel = new javax.swing.JLabel();
        qtdProdutoTextField = new javax.swing.JTextField();
        produtosScrollPane = new javax.swing.JScrollPane();
        produtosTable = new javax.swing.JTable();
        jLabel3 = new javax.swing.JLabel();
        valorProdutoTextField = new javax.swing.JTextField();
        controlProdutoPanel = new javax.swing.JPanel();
        addProdutoButton = new javax.swing.JButton();
        remProdutoButton = new javax.swing.JButton();
        newProdutoButton = new javax.swing.JButton();
        totalPanel = new javax.swing.JPanel();
        totalPedidoLabel = new javax.swing.JLabel();

        setClosable(true);
        setIconifiable(true);

        comandosPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(""));
        comandosPanel.setLayout(new java.awt.GridLayout(1, 0));

        salvarButton.setMnemonic('S');
        salvarButton.setText("Salvar");
        salvarButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                salvarButtonActionPerformed(evt);
            }
        });
        comandosPanel.add(salvarButton);

        cancelarButton.setMnemonic('C');
        cancelarButton.setText("Cancelar");
        cancelarButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cancelarButtonActionPerformed(evt);
            }
        });
        comandosPanel.add(cancelarButton);

        getContentPane().add(comandosPanel, java.awt.BorderLayout.PAGE_END);

        contentsPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(""));

        pedidoPanel.setBorder(javax.swing.BorderFactory.createTitledBorder("Pedido"));

        codPedidoLabel.setText("Código");
        codPedidoLabel.setEnabled(false);

        codPedidoTextField.setEnabled(false);
        codPedidoTextField.setName("codPedido"); // NOI18N
        codPedidoTextField.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusGained(java.awt.event.FocusEvent evt) {
                qtdProdutoTextFieldFocusGained(evt);
            }
        });

        novoCheckBox.setMnemonic('N');
        novoCheckBox.setSelected(true);
        novoCheckBox.setText("Novo");
        novoCheckBox.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                novoCheckBoxActionPerformed(evt);
            }
        });

        dataPedidoLabel.setText("Data");

        dataPedidoTextField.setName("data"); // NOI18N
        dataPedidoTextField.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusGained(java.awt.event.FocusEvent evt) {
                qtdProdutoTextFieldFocusGained(evt);
            }
        });

        controlPedidoPanel.setLayout(new java.awt.BorderLayout());

        buscaPedidoButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/br/di0/icones/lupa16x16.png"))); // NOI18N
        buscaPedidoButton.setEnabled(false);
        buscaPedidoButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                buscaPedidoButtonActionPerformed(evt);
            }
        });

        carregarPedidoButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/br/di0/icones/add16x16.png"))); // NOI18N
        carregarPedidoButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                carregarPedidoButtonActionPerformed(evt);
            }
        });
        carregarPedidoButton.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                carregarPedidoButtonKeyReleased(evt);
            }
        });

        javax.swing.GroupLayout pedidoPanelLayout = new javax.swing.GroupLayout(pedidoPanel);
        pedidoPanel.setLayout(pedidoPanelLayout);
        pedidoPanelLayout.setHorizontalGroup(
            pedidoPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(pedidoPanelLayout.createSequentialGroup()
                .addGroup(pedidoPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, pedidoPanelLayout.createSequentialGroup()
                        .addContainerGap()
                        .addGroup(pedidoPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(codPedidoLabel)
                            .addComponent(dataPedidoLabel))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(pedidoPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, pedidoPanelLayout.createSequentialGroup()
                                .addComponent(dataPedidoTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 118, Short.MAX_VALUE)
                                .addGap(18, 18, 18)
                                .addComponent(carregarPedidoButton)
                                .addGap(17, 17, 17))
                            .addGroup(pedidoPanelLayout.createSequentialGroup()
                                .addComponent(codPedidoTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 55, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(buscaPedidoButton)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 35, Short.MAX_VALUE)
                                .addComponent(novoCheckBox))))
                    .addComponent(controlPedidoPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap())
        );
        pedidoPanelLayout.setVerticalGroup(
            pedidoPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(pedidoPanelLayout.createSequentialGroup()
                .addGroup(pedidoPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(pedidoPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(codPedidoLabel)
                        .addComponent(codPedidoTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addComponent(buscaPedidoButton, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(novoCheckBox))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(pedidoPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(pedidoPanelLayout.createSequentialGroup()
                        .addComponent(carregarPedidoButton)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(controlPedidoPanel, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(pedidoPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(dataPedidoTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(dataPedidoLabel)))
                .addContainerGap())
        );

        personPanel.setBorder(javax.swing.BorderFactory.createTitledBorder("Fornecedor"));
        personPanel.setEnabled(false);
        personPanel.setName("personPanel"); // NOI18N

        codPersonLabel.setText("Código");
        codPersonLabel.setEnabled(false);

        codPersonTextField.setEnabled(false);
        codPersonTextField.setName("person"); // NOI18N
        codPersonTextField.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusGained(java.awt.event.FocusEvent evt) {
                qtdProdutoTextFieldFocusGained(evt);
            }
            public void focusLost(java.awt.event.FocusEvent evt) {
                codPersonTextFieldFocusLost(evt);
            }
        });

        buscaPersonButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/br/di0/icones/lupa16x16.png"))); // NOI18N
        buscaPersonButton.setEnabled(false);
        buscaPersonButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                buscaPersonButtonActionPerformed(evt);
            }
        });

        nomePersonLabel.setText("Nome");
        nomePersonLabel.setEnabled(false);

        nomePersonTextField.setEditable(false);
        nomePersonTextField.setFont(new java.awt.Font("DejaVu Sans", 1, 13));
        nomePersonTextField.setFocusable(false);
        nomePersonTextField.setName("nome"); // NOI18N

        controlPersonPanel.setLayout(new java.awt.BorderLayout());

        carregarPersonButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/br/di0/icones/add16x16.png"))); // NOI18N
        carregarPersonButton.setEnabled(false);
        carregarPersonButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                carregarPersonButtonActionPerformed(evt);
            }
        });
        carregarPersonButton.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                carregarPersonButtonKeyReleased(evt);
            }
        });
        controlPersonPanel.add(carregarPersonButton, java.awt.BorderLayout.CENTER);

        javax.swing.GroupLayout personPanelLayout = new javax.swing.GroupLayout(personPanel);
        personPanel.setLayout(personPanelLayout);
        personPanelLayout.setHorizontalGroup(
            personPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(personPanelLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(personPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(codPersonLabel)
                    .addComponent(nomePersonLabel))
                .addGap(12, 12, 12)
                .addGroup(personPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(personPanelLayout.createSequentialGroup()
                        .addComponent(codPersonTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 55, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(buscaPersonButton))
                    .addGroup(personPanelLayout.createSequentialGroup()
                        .addComponent(nomePersonTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 192, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(controlPersonPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        personPanelLayout.setVerticalGroup(
            personPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(personPanelLayout.createSequentialGroup()
                .addGroup(personPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(personPanelLayout.createSequentialGroup()
                        .addGap(35, 35, 35)
                        .addComponent(nomePersonLabel))
                    .addGroup(personPanelLayout.createSequentialGroup()
                        .addGroup(personPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(personPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(codPersonLabel)
                                .addComponent(codPersonTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addComponent(buscaPersonButton, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(personPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(controlPersonPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(nomePersonTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE))))
                .addContainerGap(20, Short.MAX_VALUE))
        );

        produtosPanel.setBorder(javax.swing.BorderFactory.createTitledBorder("Produtos"));
        produtosPanel.setEnabled(false);
        produtosPanel.setName("produtosPanel"); // NOI18N

        jLabel1.setText("Código");
        jLabel1.setEnabled(false);

        codProdutoTextField.setEnabled(false);
        codProdutoTextField.setName("produto"); // NOI18N
        codProdutoTextField.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusGained(java.awt.event.FocusEvent evt) {
                qtdProdutoTextFieldFocusGained(evt);
            }
            public void focusLost(java.awt.event.FocusEvent evt) {
                codProdutoTextFieldFocusLost(evt);
            }
        });

        buscaProdutoButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/br/di0/icones/lupa16x16.png"))); // NOI18N
        buscaProdutoButton.setEnabled(false);
        buscaProdutoButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                buscaProdutoButtonActionPerformed(evt);
            }
        });

        descricaoTextField.setEditable(false);
        descricaoTextField.setFont(new java.awt.Font("DejaVu Sans", 1, 13));
        descricaoTextField.setEnabled(false);
        descricaoTextField.setFocusable(false);
        descricaoTextField.setName("descricao"); // NOI18N

        qtdProdutoLabel.setText("Quant.");
        qtdProdutoLabel.setEnabled(false);

        qtdProdutoTextField.setEnabled(false);
        qtdProdutoTextField.setName("qtd"); // NOI18N
        qtdProdutoTextField.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusGained(java.awt.event.FocusEvent evt) {
                qtdProdutoTextFieldFocusGained(evt);
            }
        });

        produtosScrollPane.setName("produtosScrollPane"); // NOI18N

        produtosTable.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "Cód", "Descrição", "Quantidade", "Preço Unit.", "Preço Total"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class
            };
            boolean[] canEdit = new boolean [] {
                false, false, false, false, false
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        produtosTable.setEnabled(false);
        produtosTable.setFocusable(false);
        produtosTable.setName("produtosTable"); // NOI18N
        produtosTable.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_INTERVAL_SELECTION);
        produtosTable.getTableHeader().setReorderingAllowed(false);
        produtosScrollPane.setViewportView(produtosTable);
        produtosTable.getColumnModel().getSelectionModel().setSelectionMode(javax.swing.ListSelectionModel.SINGLE_INTERVAL_SELECTION);
        produtosTable.getColumnModel().getColumn(0).setResizable(false);
        produtosTable.getColumnModel().getColumn(0).setPreferredWidth(10);
        produtosTable.getColumnModel().getColumn(1).setResizable(false);
        produtosTable.getColumnModel().getColumn(2).setResizable(false);
        produtosTable.getColumnModel().getColumn(3).setResizable(false);
        produtosTable.getColumnModel().getColumn(4).setResizable(false);

        jLabel3.setText("Valor Unit.");
        jLabel3.setEnabled(false);

        valorProdutoTextField.setEnabled(false);
        valorProdutoTextField.setName("valor"); // NOI18N
        valorProdutoTextField.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusGained(java.awt.event.FocusEvent evt) {
                qtdProdutoTextFieldFocusGained(evt);
            }
        });

        controlProdutoPanel.setName("controlProdutosPanel"); // NOI18N
        controlProdutoPanel.setLayout(new java.awt.BorderLayout());

        addProdutoButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/br/di0/icones/add16x16.png"))); // NOI18N
        addProdutoButton.setToolTipText("Adicionar");
        addProdutoButton.setEnabled(false);
        addProdutoButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                addProdutoButtonActionPerformed(evt);
            }
        });
        addProdutoButton.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                addProdutoButtonKeyReleased(evt);
            }
        });
        controlProdutoPanel.add(addProdutoButton, java.awt.BorderLayout.LINE_START);

        remProdutoButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/br/di0/icones/rem16x16.png"))); // NOI18N
        remProdutoButton.setToolTipText("Remover");
        remProdutoButton.setEnabled(false);
        remProdutoButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                remProdutoButtonActionPerformed(evt);
            }
        });
        controlProdutoPanel.add(remProdutoButton, java.awt.BorderLayout.CENTER);

        newProdutoButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/br/di0/icones/new16x16.png"))); // NOI18N
        newProdutoButton.setToolTipText("Novo");
        newProdutoButton.setEnabled(false);
        newProdutoButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                newProdutoButtonActionPerformed(evt);
            }
        });
        controlProdutoPanel.add(newProdutoButton, java.awt.BorderLayout.LINE_END);

        javax.swing.GroupLayout produtosPanelLayout = new javax.swing.GroupLayout(produtosPanel);
        produtosPanel.setLayout(produtosPanelLayout);
        produtosPanelLayout.setHorizontalGroup(
            produtosPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(produtosPanelLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(produtosPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(produtosScrollPane)
                    .addGroup(produtosPanelLayout.createSequentialGroup()
                        .addComponent(jLabel1)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(codProdutoTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 55, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(buscaProdutoButton)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(descricaoTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 186, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(qtdProdutoLabel)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(qtdProdutoTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 45, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jLabel3)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(valorProdutoTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 65, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(controlProdutoPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        produtosPanelLayout.setVerticalGroup(
            produtosPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(produtosPanelLayout.createSequentialGroup()
                .addGroup(produtosPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(produtosPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(codProdutoTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(jLabel1)
                        .addComponent(descricaoTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(qtdProdutoLabel)
                        .addComponent(qtdProdutoTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(jLabel3)
                        .addComponent(valorProdutoTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addComponent(buscaProdutoButton, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(controlProdutoPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(produtosScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 142, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        totalPanel.setBorder(javax.swing.BorderFactory.createTitledBorder("Total do Pedido"));
        totalPanel.setLayout(new java.awt.GridBagLayout());

        totalPedidoLabel.setFont(new java.awt.Font("DejaVu Sans", 1, 18));
        totalPedidoLabel.setText("0,00");
        totalPanel.add(totalPedidoLabel, new java.awt.GridBagConstraints());

        javax.swing.GroupLayout contentsPanelLayout = new javax.swing.GroupLayout(contentsPanel);
        contentsPanel.setLayout(contentsPanelLayout);
        contentsPanelLayout.setHorizontalGroup(
            contentsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(contentsPanelLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(contentsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(produtosPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGroup(contentsPanelLayout.createSequentialGroup()
                        .addComponent(pedidoPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(personPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(totalPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
                .addContainerGap())
        );
        contentsPanelLayout.setVerticalGroup(
            contentsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(contentsPanelLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(contentsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(totalPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGroup(contentsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                        .addComponent(personPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(pedidoPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 108, Short.MAX_VALUE)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(produtosPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );

        getContentPane().add(contentsPanel, java.awt.BorderLayout.CENTER);

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void salvarButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_salvarButtonActionPerformed
        //@TODO implementar inserção no banco
        int qtdItens = produtosTable.getModel().getRowCount();
        if (qtdItens <= 0) {
            JOptionPane.showMessageDialog(null, "Nenhum produto digitado", stringPerson,
                    JOptionPane.WARNING_MESSAGE);
        } else {
            boolean produtosOK = validarProdutos();
            if (produtosOK) {
                inserir();
            }
        }
}//GEN-LAST:event_salvarButtonActionPerformed

    private void cancelarButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelarButtonActionPerformed
        resetTela();
}//GEN-LAST:event_cancelarButtonActionPerformed

    private void novoCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_novoCheckBoxActionPerformed
        buscaPedidoButton.setEnabled(!novoCheckBox.isSelected());
        ativaCodigo(codPedidoTextField, !novoCheckBox.isSelected());
        limparTela();
        focusCicle();
}//GEN-LAST:event_novoCheckBoxActionPerformed

    private void addProdutoButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addProdutoButtonActionPerformed
        if (validarProduto()) {
            popularTabela();
        }
        codProdutoTextField.requestFocus();
        codProdutoTextField.selectAll();
    }//GEN-LAST:event_addProdutoButtonActionPerformed

    /**
     * Remove o produto selecionado na tabela
     * @param evt ActionEvent
     */
    private void remProdutoButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_remProdutoButtonActionPerformed
        int index = produtosTable.getSelectedRow();
        if (index != -1) {
            ((DefaultTableModel) produtosTable.getModel()).removeRow(index);
            codProdutoTextField.requestFocus();
        }
        calcularTotalPedido();
        codProdutoTextField.setText("");
        descricaoTextField.setText("");
        qtdProdutoTextField.setText("");
        valorProdutoTextField.setText("");
        update = false;
        codProdutoTextField.requestFocus();
    }//GEN-LAST:event_remProdutoButtonActionPerformed

    private void carregarPedidoButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_carregarPedidoButtonActionPerformed
        carregarPedido();
}//GEN-LAST:event_carregarPedidoButtonActionPerformed

    private void newProdutoButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_newProdutoButtonActionPerformed
        codProdutoTextField.setText("");
        descricaoTextField.setText("");
        qtdProdutoTextField.setText("");
        valorProdutoTextField.setText("");
        update = false;
        codProdutoTextField.requestFocus();
}//GEN-LAST:event_newProdutoButtonActionPerformed

    private void addProdutoButtonKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_addProdutoButtonKeyReleased
        if (evt.getKeyCode() == KeyEvent.VK_ENTER) {
            if (validarProduto()) {
                popularTabela();
            }
            codProdutoTextField.selectAll();
        }
    }//GEN-LAST:event_addProdutoButtonKeyReleased

    private void qtdProdutoTextFieldFocusGained(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_qtdProdutoTextFieldFocusGained
        JTextField field = (JTextField) evt.getSource();
        field.selectAll();
        if (field.getName().equals("person")) {
            carregarPersonName();
        }
        if (field.getName().equals("produto")) {
            carregarProduto();
        }
    }//GEN-LAST:event_qtdProdutoTextFieldFocusGained

    private void carregarPedidoButtonKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_carregarPedidoButtonKeyReleased
        if (evt.getKeyCode() == KeyEvent.VK_ENTER) {
            carregarPedido();
        }
    }//GEN-LAST:event_carregarPedidoButtonKeyReleased

    private void carregarPersonButtonKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_carregarPersonButtonKeyReleased
        if (evt.getKeyCode() == KeyEvent.VK_ENTER) {
            if (codPersonTextField.getText().equals("")) {
                JOptionPane.showMessageDialog(null, "Código não encontrado",
                        "Atenção", JOptionPane.WARNING_MESSAGE);
            } else {
                carregarPerson();
            }
        }
}//GEN-LAST:event_carregarPersonButtonKeyReleased

    private void carregarPersonButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_carregarPersonButtonActionPerformed
        if (codPersonTextField.getText().equals("")) {
            JOptionPane.showMessageDialog(null, "Código não encontrado",
                    "Atenção", JOptionPane.WARNING_MESSAGE);
        } else {
            carregarPerson();
        }
}//GEN-LAST:event_carregarPersonButtonActionPerformed

    private void buscaPersonButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buscaPersonButtonActionPerformed
        String type = Integer.toString(tipoPerson);
        ConsultaPersonDialog person = new ConsultaPersonDialog(null, true, codPersonTextField, type);
        if (type.equals(Integer.toString(CadastroInternalFrame.CLIENTE))) {
            person.setTitle("Clientes");
        } else if (type.equals(Integer.toString(CadastroInternalFrame.FORNECEDOR))) {
            person.setTitle("Fornecedores");
        }
        person.setVisible(true);
    }//GEN-LAST:event_buscaPersonButtonActionPerformed

    private void codPersonTextFieldFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_codPersonTextFieldFocusLost
        Component comp = evt.getOppositeComponent();
        if (comp != null) {
            if (comp.getName() == null) {
                carregarPersonName();
            }

        }
    }//GEN-LAST:event_codPersonTextFieldFocusLost

    private void buscaProdutoButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buscaProdutoButtonActionPerformed
        String type = Integer.toString(tipoPerson);
        ConsultaProdutoDialog person = new ConsultaProdutoDialog(null, true, codProdutoTextField, type);
        person.setVisible(true);
    }//GEN-LAST:event_buscaProdutoButtonActionPerformed

    private void codProdutoTextFieldFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_codProdutoTextFieldFocusLost
        carregarProduto();
    }//GEN-LAST:event_codProdutoTextFieldFocusLost

    private void buscaPedidoButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buscaPedidoButtonActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_buscaPedidoButtonActionPerformed

    private void resetTela() {
        limparTela();
        enableJComponents(personPanel, false);
        enableJComponents(produtosPanel, false);
        enableJComponents(pedidoPanel, true);
        novoCheckBox.setSelected(true);
        buscaPedidoButton.setEnabled(false);
        codPedidoLabel.setEnabled(false);
        codPedidoTextField.setEnabled(false);
        focusCicle();
    }

    private void inserir() {
        //TODO inserir itens juntamente com a compra
        //analisar operação commit e rollback
        InsertMovimento movto = new InsertMovimento(tipoPerson);
        String codPerson = codPersonTextField.getText();
        int result = movto.inserir(codPerson);
        String codMovto = movto.getLastMovto();
        if ((result == 0) || (codMovto == null)) {
            JOptionPane.showMessageDialog(null, "Não foi possivel inserir",
                    stringPerson, JOptionPane.ERROR_MESSAGE);
        } else {
            boolean produtosInseridos = false;
            int qtdItens = produtosTable.getModel().getRowCount();
            for (int index = 0; index < qtdItens; index++) {
                String[] item = new String[5];
                item[0] = codMovto;
                item[1] = (String) produtosTable.getValueAt(index, 0); //código
                item[2] = (String) produtosTable.getValueAt(index, 2); //quantidade
                item[3] = (String) produtosTable.getValueAt(index, 3); //valor unitario
                item[4] = (String) produtosTable.getValueAt(index, 4); // valor total
                item[3] = item[3].replace(",", ".");
                item[4] = item[4].replace(",", ".");
                result = movto.inserirItens(item);
                //TODO implementar tratamento de erro ao inserir item_compra/venda
                //inutilizar pedido, excluir tudo.
                if (result == 1) {
                    produtosInseridos = true;
                } else {
                    produtosInseridos = false;
                }
            }
            if (produtosInseridos) {
                JOptionPane.showMessageDialog(null, stringPerson.replace("s", "") +
                        " realizada com sucesso", stringPerson,
                        JOptionPane.INFORMATION_MESSAGE);
                resetTela();
            } else {
                //TODO apagar toda a compra
                JOptionPane.showMessageDialog(null, stringPerson.replace("s", "") +
                        " não realizada", stringPerson,
                        JOptionPane.ERROR_MESSAGE);
            }
        }
    }

    /**
     * Varre a tabela de produtos e confere o saldo de cada produto no estoque
     * @return TRUE se todos os produtos possuirem saldo suficiente para operação
     * FALSE se algum produto não possuir saldo suficiente.
     */
    private boolean validarProdutos() {
        int qtdItens = produtosTable.getModel().getRowCount();
        boolean produtosOK = false;
        for (int index = 0; index < qtdItens; index++) {
            String produto = (String) produtosTable.getValueAt(index, 0);
            String qtdProd = (String) produtosTable.getValueAt(index, 2);
            int qtdProduto = Integer.parseInt(qtdProd);

            int saldoProduto = InsertEstoque.getEstoqueProduto(produto);
            System.out.println("Saldo do produto " + produto + ": " + saldoProduto);
            if (tipoPerson == CLIENTE) {
                if ((saldoProduto <= 0) || (qtdProduto > saldoProduto)) {
                    JOptionPane.showMessageDialog(null, "Saldo insuficiente " +
                            "parao produto [" + produto + "]", stringPerson,
                            JOptionPane.WARNING_MESSAGE);
                    return false;
                }
            }
            produtosOK = true;
        }
        return produtosOK;
    }

    /**
     * Produra pelo produto digitado no campo codProduto
     */
    private void carregarProduto() {
        String codProduto = codProdutoTextField.getText();

        if (!codProduto.equals("")) {
            String produto[] = InsertProdutos.localizar(codProduto);
            if (produto != null) {
                descricaoTextField.setText(produto[0]);
            } else {
                JOptionPane.showMessageDialog(null, "Código não encontrado",
                        "Cadastro de Produtos", JOptionPane.ERROR_MESSAGE);
                codProdutoTextField.setText("");
                codProdutoTextField.requestFocus();
            }
        }
    }

    /**
     * Valida os dados inseridos para Cliente ou Fornecedor e habilita inserção de produtos.
     */
    private void carregarPerson() {
        enableJComponents(produtosPanel, true);
        enableJComponents(personPanel, false);
        focusCicle();

        codProdutoTextField.requestFocus();
    }

    public boolean carregarPersonName() {
        String per = null;
        if (tipoPerson == CLIENTE) {
            per = "Cliente";
        } else {
            per = "Fornecedor";
        }

        String codPerson = codPersonTextField.getText();
        InsertPerson db = new InsertPerson(tipoPerson);

        if (!codPerson.equals("")) {
            String person[] = db.localizar(codPerson);
            if (person != null) {
                nomePersonTextField.setText(person[0]);
                return true;

            } else {
                JOptionPane.showMessageDialog(null, "Código não encontrado",
                        "Cadastro de " + per, JOptionPane.ERROR_MESSAGE);
                codPersonTextField.setText("");
                codPersonTextField.requestFocus();
                return false;
            }

        }
        return false;
    }

    /**
     * Valida os dados inseridos referente a pedido e habilita seleção de Cliente ou Fornecedor.
     */
    private void carregarPedido() {
        //PENDING validar data ou se é pedido novo

        enableJComponents(personPanel, true);
        enableJComponents(pedidoPanel, false);
        focusCicle();

        codPersonTextField.requestFocus();
    }

    /**
     * Atualiza o JLabel referente ao total dos pedidos somando todos os itens na
     * JTable de produtos.
     */
    private void calcularTotalPedido() {
        int maxRows = produtosTable.getModel().getRowCount();
        double totalPedido = 0;

        java.text.DecimalFormatSymbols dfs = new java.text.DecimalFormatSymbols();
        dfs.setDecimalSeparator(',');
        dfs.setGroupingSeparator('.');
        java.text.DecimalFormat df = new java.text.DecimalFormat("#,###,##0.00", dfs);

        Number aux = 0;


        for (int index = 0; index <
                maxRows; index++) {
            try {
                aux = df.parse((String) produtosTable.getValueAt(index, 4));
            } catch (Exception e) {
                System.out.println("Erro no parse");
                e.printStackTrace();
            }

            try {
                if (!(aux instanceof Long)) {
                    totalPedido = (Double) aux + totalPedido;
                } else {
                    totalPedido = Double.parseDouble(Long.toString((Long) aux)) + totalPedido;
                    //totalPedido = Double.parseDouble(df.format(totalPedido));
                }

            } catch (Exception ex) {
                System.out.println("Erro no casting");
                ex.printStackTrace();
            }

        }

        //formatar Label
        String tt = Double.toString(totalPedido);
        String auxTT = tt.replace(".", ",");

        auxTT =
                String.format("%.2f", totalPedido);
        String[] a = auxTT.split(",");

        totalPedidoLabel.setText(auxTT);
    }

    /**
     * Procura um produto na JTable
     * @param cod o código do produto a ser localizado
     * @return TRUE se o produto já estiver na JTable. FALSE caso contrário
     */
    private boolean localizarProduto(String cod) {
        int maxRows = produtosTable.getModel().getRowCount();
        for (int index = 0; index <
                maxRows; index++) {
            String cod2 = (String) produtosTable.getValueAt(index, 0);
            if (cod2.equals(cod)) {
                return true;
            }

        }
        return false;
    }

    /**
     * Verifica os dados a serem inseridos na JTable.
     * @return TRUE se os dados forem consistentes. FALSE caso contrário.
     */
    private boolean validarProduto() {
        boolean valido = true;
        //FIXME impedir inserir produto duplicado
        /*BUG-> selecionar um produto e alterar seu código para produto ja existente, sistema aceita */
        if (!update && localizarProduto(codProdutoTextField.getText())) {
            JOptionPane.showMessageDialog(null, "Produto [" +
                    descricaoTextField.getText() + "] já consta na lista", "ERRO",
                    JOptionPane.ERROR_MESSAGE);
            codProdutoTextField.requestFocus();
            codProdutoTextField.selectAll();
            valido = false;
        } else if (codProdutoTextField.getText().equals("")) {
            JOptionPane.showMessageDialog(null, "Código do produto não informado",
                    "ERRO", JOptionPane.ERROR_MESSAGE);
            codProdutoTextField.requestFocus();
            codProdutoTextField.selectAll();
            valido = false;
        } else if (Integer.parseInt(codProdutoTextField.getText()) <= 0) {
            JOptionPane.showMessageDialog(null, "Código do produto deve ser " +
                    "maior que zero", "ERRO", JOptionPane.ERROR_MESSAGE);
            codProdutoTextField.requestFocus();
            codProdutoTextField.selectAll();
            valido = false;
        }

        if (qtdProdutoTextField.getText().equals("")) {
            JOptionPane.showMessageDialog(null, "Quantidade do produto não informada",
                    "ERRO", JOptionPane.ERROR_MESSAGE);
            qtdProdutoTextField.requestFocus();
            qtdProdutoTextField.selectAll();
            valido = false;
        } else if (Integer.parseInt(qtdProdutoTextField.getText()) <= 0) {
            JOptionPane.showMessageDialog(null, "Quantidade do produto deve ser " +
                    "maior que zero", "ERRO", JOptionPane.ERROR_MESSAGE);
            qtdProdutoTextField.requestFocus();
            qtdProdutoTextField.selectAll();
            valido = false;
        }

        if (valorProdutoTextField.getText().equals("")) {
            JOptionPane.showMessageDialog(null, "Valor do produto não informada",
                    "ERRO", JOptionPane.ERROR_MESSAGE);
            valorProdutoTextField.requestFocus();
            valorProdutoTextField.selectAll();
            valido =
                    false;
        } else if (Float.parseFloat(valorProdutoTextField.getText().replace(",", ".")) <= 0.0) {
            JOptionPane.showMessageDialog(null, "Valor do produto deve ser " +
                    "maior que zero", "ERRO", JOptionPane.ERROR_MESSAGE);
            qtdProdutoTextField.requestFocus();
            qtdProdutoTextField.selectAll();
            valido =
                    false;
        }

        return valido;
    }

    /**
     * Captura os dados dos JTextFields e chama o método para inserir na tabela.
     */
    private void popularTabela() {
        Vector<String> dados = new Vector<String>(5);
        dados.add(codProdutoTextField.getText());
        dados.add(descricaoTextField.getText());
        dados.add(qtdProdutoTextField.getText());

        //Alterar padrão do formato Decimal
        java.text.DecimalFormatSymbols dfs = new java.text.DecimalFormatSymbols();
        dfs.setDecimalSeparator(',');
        dfs.setGroupingSeparator('.');
        java.text.DecimalFormat df = new java.text.DecimalFormat("#,###,##0.00", dfs);
        String precoUnit = new String("0");
        Double valor = 0.0;
        //fim alteração padrão

        //alterar formato de preço unitário, somente 2 casas decimais após a virgula
        Number aux = 0;
        try {
            aux = df.parse(valorProdutoTextField.getText());
        } catch (Exception e) {
            e.printStackTrace();
        }

        try {
            if (!(aux instanceof Long)) {
                valor = (Double) aux;
            } else {
                valor = Double.parseDouble(Long.toString((Long) aux));
            }

            precoUnit = df.format(valor);
        } catch (Exception ex) {
            System.out.println("Erro no casting");
            ex.printStackTrace();
        }

        dados.add(precoUnit);

        //calcular preço total
        Double valorTT = new Double(Integer.parseInt(dados.get(2)) * valor);

        dados.add(df.format(valorTT));
        //se update for falso, pegar a quantidade de linhas e insere uma nova linha
        if (!update) {
            updateIndex = produtosTable.getModel().getRowCount();
            ((DefaultTableModel) produtosTable.getModel()).addRow(new Vector());
        }

        inserirProdutoTable(dados, updateIndex);
        update = false; //sempre retornar update para false, (Inserir e não Atualizar)

        //limpar Produtos
        codProdutoTextField.setText("");
        descricaoTextField.setText("");
        qtdProdutoTextField.setText("");
        valorProdutoTextField.setText("");
        codProdutoTextField.requestFocus();
    }

    public void setProdutoSelected(int index) {
        codProdutoTextField.setText((String) produtosTable.getValueAt(index, 0));
        descricaoTextField.setText((String) produtosTable.getValueAt(index, 1));
        qtdProdutoTextField.setText((String) produtosTable.getValueAt(index, 2));
        valorProdutoTextField.setText((String) produtosTable.getValueAt(index, 3));
    }

    /**
     * Insere ou atualiza os dados de um Vector de Strings na produtosTable.
     * @param dados o Vector a ser inserido.
     * @param index a linha a ser inserida ou atualizada.
     */
    private void inserirProdutoTable(Vector<String> dados, int index) {
        produtosTable.setValueAt(dados.get(0), index, 0);
        produtosTable.setValueAt(dados.get(1), index, 1);
        produtosTable.setValueAt(dados.get(2), index, 2);
        produtosTable.setValueAt(dados.get(3), index, 3);
        produtosTable.setValueAt(dados.get(4), index, 4);
        calcularTotalPedido();

    }

    /**
     * Ativa ou Desativa todos Componentes de um JComponent que podem obter foco
     * ou são instancia de JTable
     * @param jComponent o JComponent a ser percorrido
     * @param enable TRUE caso desejar ativar os componentes e FALSE caso contrário
     */
    private void enableJComponents(JComponent jComponent, boolean enable) {
        jComponent.setEnabled(enable);

        Component vetor[] = jComponent.getComponents();

        for (int cont = 0; cont <
                vetor.length; cont++) {

            if (vetor[cont].isFocusable() || (vetor[cont] instanceof JTable)) {
                vetor[cont].setEnabled(enable);
            }

            if (vetor[cont] instanceof JScrollPane) {
                JScrollPane aux = (JScrollPane) vetor[cont];
                enableJComponents(aux, enable);
            } else if (vetor[cont] instanceof JComponent) {
                JComponent aux = (JComponent) vetor[cont];
                enableJComponents(aux, enable);
            }
        }
    }

    public void setCodText(String cod) {
        //inutil
    }
    private boolean update = false;
    private int updateIndex = 0;
    private int tipoPerson;
    private String stringPerson = null;
    private ListSelectionModel listSelectionModel;
    private MetodosUteis utils = new MetodosUteis();
    private IDocument doc;
    private Vector<Component> order = new Vector<Component>(14);
    private MyOwnFocusTraversalPolicy newPolicy;
    public static final int CLIENTE = 1;
    public static final int FORNECEDOR = 2;
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton addProdutoButton;
    private javax.swing.JButton buscaPedidoButton;
    private javax.swing.JButton buscaPersonButton;
    private javax.swing.JButton buscaProdutoButton;
    private javax.swing.JButton cancelarButton;
    private javax.swing.JButton carregarPedidoButton;
    private javax.swing.JButton carregarPersonButton;
    private javax.swing.JLabel codPedidoLabel;
    private javax.swing.JTextField codPedidoTextField;
    private javax.swing.JLabel codPersonLabel;
    private javax.swing.JTextField codPersonTextField;
    private javax.swing.JTextField codProdutoTextField;
    private javax.swing.JPanel comandosPanel;
    private javax.swing.JPanel contentsPanel;
    private javax.swing.JPanel controlPedidoPanel;
    private javax.swing.JPanel controlPersonPanel;
    private javax.swing.JPanel controlProdutoPanel;
    private javax.swing.JLabel dataPedidoLabel;
    private javax.swing.JTextField dataPedidoTextField;
    private javax.swing.JTextField descricaoTextField;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JButton newProdutoButton;
    private javax.swing.JLabel nomePersonLabel;
    private javax.swing.JTextField nomePersonTextField;
    private javax.swing.JCheckBox novoCheckBox;
    private javax.swing.JPanel pedidoPanel;
    private javax.swing.JPanel personPanel;
    private javax.swing.JPanel produtosPanel;
    private javax.swing.JScrollPane produtosScrollPane;
    private javax.swing.JTable produtosTable;
    private javax.swing.JLabel qtdProdutoLabel;
    private javax.swing.JTextField qtdProdutoTextField;
    private javax.swing.JButton remProdutoButton;
    private javax.swing.JButton salvarButton;
    private javax.swing.JPanel totalPanel;
    private javax.swing.JLabel totalPedidoLabel;
    private javax.swing.JTextField valorProdutoTextField;
    // End of variables declaration//GEN-END:variables

    /**
     * Limpa os campos da janela.
     */
    public void limparTela() {
        utils.limparCampos(contentsPanel);
        int index = produtosTable.getRowCount();
        for (int i = 0; i <
                index; i++) {
            ((DefaultTableModel) produtosTable.getModel()).removeRow(0);
        }

        if (novoCheckBox.isSelected()) {
            dataPedidoTextField.requestFocus();
        } else {
            codPedidoTextField.requestFocus();
        }

        calcularTotalPedido();
    }

    /**
     * Define o ciclo de foco nos itens da janela.
     */
    public void focusCicle() {
        order = new Vector<Component>(14);
        if (pedidoPanel.isEnabled()) {
            if (!novoCheckBox.isSelected()) {
                order.add(codPedidoTextField);
            }

            order.add(novoCheckBox);
            order.add(dataPedidoTextField);
            order.add(carregarPedidoButton);
        }

        if (personPanel.isEnabled()) {
            order.add(codPersonTextField);
            order.add(buscaPersonButton);
            order.add(carregarPersonButton);
        }

        if (produtosPanel.isEnabled()) {
            order.add(codProdutoTextField);
            order.add(buscaProdutoButton);
            order.add(qtdProdutoTextField);
            order.add(valorProdutoTextField);
            order.add(addProdutoButton);
            order.add(remProdutoButton);
            order.add(newProdutoButton);
        }

        order.add(salvarButton);
        order.add(cancelarButton);

        newPolicy =
                new MyOwnFocusTraversalPolicy(order);
        this.setFocusTraversalPolicy(newPolicy);
    }

    /**
     * Aplica Expressões Regulares em JTextFields da janela
     */
    public void limitarCampos() {
        //Panel Pedido
        doc = new DocNumeros();
        codPedidoTextField.setDocument(doc.getDocumentoPlano());

        doc =
                new DocNovo("[0-9|\\/]*", 10);
        dataPedidoTextField.setDocument(doc.getDocumentoPlano());

        //Panel Person
        doc =
                new DocNumeros(5);
        codPersonTextField.setDocument(doc.getDocumentoPlano());

        //Panel Produtos
        doc =
                new DocNumeros(5);
        codProdutoTextField.setDocument(doc.getDocumentoPlano());

        doc =
                new DocNumeros();
        qtdProdutoTextField.setDocument(doc.getDocumentoPlano());

        doc =
                new DocNovo("[0-9|\\,|\\.]*");
        valorProdutoTextField.setDocument(doc.getDocumentoPlano());

    }

    /**
     * Controle do JCheckBox novo.
     * @param codigoField o campo JTextField referente ao código.
     * @param desativar o status
     */
    public void ativaCodigo(JTextField codigoField, boolean desativar) {
        codPedidoLabel.setEnabled(desativar);
        codigoField.setEnabled(desativar);
        if (!codigoField.isEnabled()) {
            codigoField.setText("");
        }





    }

    /**
     * Listener que captura qual linha da JTable foi selecionada e joga os dados da linha
     * nos JTextFields.
     */
    class SharedListSelectionHandler implements ListSelectionListener {

        public void valueChanged(ListSelectionEvent e) {
            ListSelectionModel lsm = (ListSelectionModel) e.getSource();


            if (!lsm.isSelectionEmpty()) {
                int minIndex = lsm.getMinSelectionIndex();
                codProdutoTextField.setText((String) produtosTable.getValueAt(minIndex, 0));
                descricaoTextField.setText((String) produtosTable.getValueAt(minIndex, 1));
                qtdProdutoTextField.setText((String) produtosTable.getValueAt(minIndex, 2));
                valorProdutoTextField.setText((String) produtosTable.getValueAt(minIndex, 3));
                update = true;
                updateIndex = minIndex;
            }
            //output.append(newline);
        }
    }
}



